package com.singleton;

/**
 * holder的方式完全借助了类加载的特点，在SingletonHolder类中没有instance静态变量，而是将其放到了静态内部类Holder中，因此在SingletonHolder类
 * 初始化过程中并不会创建SingletonHolder的实例，Holder类中定义了SingletonHolder的静态变量，并且直接进行了实例化，当Holder被主动引用的时候则会创建
 * SingletonHolder实例，SingletonHolder实例的创建过程在java程序编译时期收集至<clinit>()方法中，该方法又是同步方法，同步方法可以保证内存可见性。jvm指令
 * 的顺序性和原子性。
 *
 * @author dell
 *
 */
// 使用SingletonHolder时，默认会先初始化内部类
// 如果没有使用，则内部类不会被加载
public class SingletonHolder {

	private byte[] data = new byte[1024];//实例变量

	// 默认不加载
	private static class Holder{
		private static SingletonHolder instance = new SingletonHolder();
	}

	private SingletonHolder() {
		// 防止反射调用
		if(Holder.instance != null){
			throw new RuntimeException("不允许创建多个实例！");
		}
	}

	// atic为了使单例的空间共享，final保证方法不被重写
	public static final SingletonHolder getInstance(){
		return Holder.instance;
	}

}